package com.chainofresponsibility;

/**
 * 在职责链设计模式总，会用多种不同的方式来解决同一个问题，然后将他们链接在一起。当一个请求到来时，它遍历这个链直到链中的某个解决方案能够处理该请求。
 * 其中每次尝试都可以看做为一个策略，而完整的处理方式列表就是一个职责链。
 * 
 * @author Administrator
 *
 */
public class PostOffice {

	/*
	 * 定义了四种处理邮件的方式 每一种都会返回对应的值true或false 如果返回false表示该种方式不可行
	 */
	enum MailHandler {
		GENERAL_DELIVERY {
			@Override
			boolean handle(Mail m) {
				switch (m.generalDelivery) {
				case YES:
					System.out.println("Using general delivery for " + m);
					return true;
				default:
					break;
				}
				return false;
			}

		},
		MACHINE_SCAN {
			@Override
			boolean handle(Mail m) {
				switch (m.scannability) {
				case UNSCANNABLE:
					return false;
				default:
					switch (m.address) {
					case INCORRECT:
						return false;
					default:
						System.out
								.println("Delivering " + m + " atuomatically");
						return true;
					}
				}
			}

		},
		VISUAL_INSPECTION {
			@Override
			boolean handle(Mail m) {
				switch (m.readability) {
				case ILLEGIBLE:
					return false;
				default:
					switch (m.address) {
					case INCORRECT:
						return false;
					default:
						System.out.println("Delivering " + m + " normally");
						return true;
					}
				}
			}

		},
		RETURN_TO_SENOER {
			@Override
			boolean handle(Mail m) {
				switch (m.returnAddress) {
				case MISSING:
					return false;
				default:
					System.out.println("Returing " + m + " to sender");
					return true;
				}
			}

		};

		private boolean t = false;

		// 构造方法最早执行，并且会初始化实例的变量t
		MailHandler() {
			t = true;
			System.out.println("初始化" + t);
		}

		abstract boolean handle(Mail m);
	}

	/**
	 * 按照MailHandler中的几种方法依次处理该邮件， 如果有一种可以处理则返回成功 如果所有的方法都不能处理，判定该邮件为死信
	 * 
	 * @param m
	 *            邮件
	 */
	static void handle(Mail m) {
		for (MailHandler handler : MailHandler.values()) {
			if (handler.handle(m) && handler.t) {
				return;
			}
		}
		System.out.println(m + " is a dead letter.");
	}

	public static void main(String[] args) {
		// 随机生成10封信
		// 就是有很多种处理信的方式，来了一封信就用这些方式依次处理，如果所有的方式都不能处理那就是死信，一旦有一种可以处理就通过。
		// enum MailHandler 中每一种处理方式都可以看成是一种策略，如果想增加处理方式，直接在enum MailHandler
		// 添加即可，特别方便
		for (Mail mail : Mail.generator(10)) {
			System.out.println(mail.details());
			handle(mail);
			System.out.println("===============================");
		}
	}

}
